策略模式

策略模式

策略模式定义

定义一系列的算法,把它们一个个封装起来,并且使他们可互相替换。本模式使得算法可独立与使用它的客户而变化。
有个管理类

策略模式使用场景

特点:
一堆的处理类, 虽然新增了很多类, 但是职责很明确, 基本符合对 修改关闭对扩展开放 的原则

策略模式&工厂消除 if else

消除前

@Test
public void testJump() {
    jump("im");
    jump("settings");
}

private void jump(String actionType) {
    if (JUMP_IM.equals(actionType)) {
        System.out.println("去小纸条");
    } else if (JUMP_SETTINGS.equals(actionType)) {
        System.out.println("去设置");
    } else if (JUMP_CIRCLE_DETAIL.equals(actionType)) {
        System.out.println("去糗友圈详情页");
    } else if (JUMP_CIRCLE_FOLLOW.equals(actionType)) {
        System.out.println("去糗友圈关注");
    } else if (JUMP_CIRCLE_NEARBY.equals(actionType)) {
        System.out.println("去糗友圈隔壁");
    } else if (JUMP_CIRCLE_POST.equals(actionType)) {
        System.out.println("去糗友圈发帖");
    } else if (JUMP_CIRCLE_TOPIC.equals(actionType)) {
        System.out.println("去糗友圈发帖");
    }
}

消除后

/**
 * 策略
 */
interface AbsJumpStrategy {
    boolean canHandle();

    void jump();
}
final class CircleDetailJumpStrategy implements AbsJumpStrategy {
    @Override
    public boolean canHandle() {
        return true;
    }
    @Override
    public void jump() {
        System.out.println("jump settings");
    }
}
final class ImJumpStrategy implements AbsJumpStrategy {
    @Override
    public boolean canHandle() {
        return true;
    }
    @Override
    public void jump() {
        System.out.println("im jump");
    }
}
final class SettingsJumpStrategy implements AbsJumpStrategy {
    @Override
    public boolean canHandle() {
        return true;
    }
    @Override
    public void jump() {
        System.out.println("jump settings");
    }
}
final class StrategyFactory {

    public static final String JUMP_IM = "im";                 // IM标签
    public static final String JUMP_SETTINGS = "settings";     // 设置
    public static final String JUMP_CIRCLE_DETAIL = "circle_article_detail"; // 动态动态页

    private static StrategyFactory factory = new StrategyFactory();
    private static Map<String, AbsJumpStrategy> strategyMap = new HashMap<>();

    private StrategyFactory() {
    }

    public static StrategyFactory getInstance() {
        return factory;
    }

    public AbsJumpStrategy create(String type) {
        return strategyMap.get(type);
    }

    static {
        strategyMap.put(JUMP_IM, new ImJumpStrategy());
        strategyMap.put(JUMP_SETTINGS, new SettingsJumpStrategy());
        strategyMap.put(JUMP_CIRCLE_DETAIL, new CircleDetailJumpStrategy());
    }
}
/**
 * 策略上下文
 */
public class StrategyContext {
    public static void jump(String type) {
        AbsJumpStrategy strategy = StrategyFactory.getInstance()
                .create(type);
        if (strategy != null && strategy.canHandle()) {
            strategy.jump();
        } else {
            System.err.println("没有找到具体的策略。。。:" + type);
        }
    }
}
@Test
public void testJump2() {
    String type = "im1";
    StrategyContext.jump(type);
}